package ru.pb.game.objects.model.inventory;

import gnu.trove.map.hash.TIntObjectHashMap;

import org.apache.log4j.Logger;

import ru.pb.game.data.templates.CuponTemplate;
import ru.pb.game.objects.model.inventory.emuns.EQMIPEMENT_SLOT;
import ru.pb.game.objects.model.items.Item;
import ru.pb.game.objects.model.items.enums.ItemLocation;
import ru.pb.game.objects.model.players.Player;

public class PlayerInventory<OWNER extends Player> extends ItemContainer<OWNER>
{
	private static final Logger _log = Logger.getLogger(PlayerInventory.class);
	private TIntObjectHashMap<Item> _equippedItems = new TIntObjectHashMap<Item>(EQMIPEMENT_SLOT.values().length);

	public PlayerInventory(OWNER owner)
	{
		super(owner);
	}

	@Override
	public ItemLocation getBaseLocation()
	{
		return ItemLocation.INVENTORY;
	}

	@Override
	public final ItemLocation getEquipLocation()
	{
		return ItemLocation.PAPERDOLL;
	}

	// ============================================================================================================
	// Overrides
	// ============================================================================================================
	@Override
	protected Item addItem(Item newItem, boolean dbUpdate)
	{
		Item item = super.addItem(newItem, dbUpdate);
		return item;
	}

	@Override
	public Item destroyItem(Item item, int count)
	{
		return super.destroyItem(item, count);
	}

	@Override
	public Item transfer(Item item, int count, ItemContainer<?> toContainer)
	{
		return super.transfer(item, count, toContainer);
	}

	@Override
	public Item removeItem(Item item, int count)
	{
		return super.removeItem(item, count);
	}

	@Override
	public void databaseRestore(Item item)
	{
		if(item == null)
			return;

		Item newItem = addItem(item, false);
		if(newItem == null)
			return;

		if(item != newItem)
		{
			item.updateDatabase();
			newItem.updateDatabase();
		}
	}

	public Item[] getEquippedItems()
	{
		return _equippedItems.values();
	}

	public Item getItemBySlot(final EQMIPEMENT_SLOT slot)
	{
		return _equippedItems.get(slot.ordinal());
	}

	public int getItemIdBySlot(final EQMIPEMENT_SLOT slot)
	{
		return getItemBySlot(slot) != null ? getItemBySlot(slot).getItemId() : 0;
	}

	public void equipItem(Item item)
	{
		if( !item.isEquipped() && item.isEquipable() && !(item.getTemplate() instanceof CuponTemplate))
		{
			item.setEquipped(true);
			item.setLocation(getEquipLocation());
			item.updateDatabase();
			_equippedItems.put(item.getTemplate().getItemSlot().ordinal(), item);
		}
	}

	public void unEquipItem(Item item)
	{
		if(item.isEquipped() && item.isEquipable() && !(item.getTemplate() instanceof CuponTemplate))
		{
			item.setEquipped(false);
			item.setLocation(getBaseLocation());
			item.updateDatabase();
			_equippedItems.remove(item.getTemplate().getItemSlot().ordinal());
		}
	}
}